home *** CD-ROM | disk | FTP | other *** search
/ Freelog 125 / Freelog_MarsAvril2015_No125.iso / Musique / Quod Libet / quodlibet-3.3.0-installer.exe / bin / quodlibet / qltk / queue.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2014-12-31  |  12KB  |  275 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.7)
  3.  
  4. import os
  5. from gi.repository import Gtk, Gdk
  6. from quodlibet import config
  7. from quodlibet import const
  8. from quodlibet import util
  9. from quodlibet import qltk
  10. from quodlibet.util import connect_obj, connect_destroy
  11. from quodlibet.qltk.ccb import ConfigCheckButton
  12. from quodlibet.qltk.songlist import SongList, DND_QL, DND_URI_LIST
  13. from quodlibet.qltk.songsmenu import SongsMenu
  14. from quodlibet.qltk.songmodel import PlaylistModel
  15. from quodlibet.qltk.playorder import OrderInOrder, OrderShuffle
  16. from quodlibet.qltk.x import ScrolledWindow, SymbolicIconImage, SmallImageButton
  17. QUEUE = os.path.join(const.USERDIR, 'queue')
  18.  
  19. class PlaybackStatusIcon(Gtk.Box):
  20.     '''A widget showing a play/pause/stop symbolic icon'''
  21.     
  22.     def __init__(self):
  23.         super(PlaybackStatusIcon, self).__init__()
  24.         self._icons = { }
  25.  
  26.     
  27.     def _set(self, name):
  28.         if name not in self._icons:
  29.             image = SymbolicIconImage(name, Gtk.IconSize.MENU)
  30.             self._icons[name] = image
  31.             image.show()
  32.         else:
  33.             image = self._icons[name]
  34.         children = self.get_children()
  35.         if children:
  36.             self.remove(children[0])
  37.         self.add(image)
  38.  
  39.     
  40.     def play(self):
  41.         self._set('media-playback-start')
  42.  
  43.     
  44.     def stop(self):
  45.         self._set('media-playback-stop')
  46.  
  47.     
  48.     def pause(self):
  49.         self._set('media-playback-pause')
  50.  
  51.  
  52.  
  53. class QueueExpander(Gtk.Expander):
  54.     
  55.     def __init__(self, menu, library, player):
  56.         super(QueueExpander, self).__init__(spacing = 3)
  57.         sw = ScrolledWindow()
  58.         sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
  59.         sw.set_shadow_type(Gtk.ShadowType.IN)
  60.         self.queue = PlayQueue(library, player)
  61.         sw.add(self.queue)
  62.         outer = Gtk.HBox(spacing = 12)
  63.         left = Gtk.HBox(spacing = 12)
  64.         hb2 = Gtk.HBox(spacing = 3)
  65.         state_icon = PlaybackStatusIcon()
  66.         state_icon.stop()
  67.         state_icon.show()
  68.         hb2.pack_start(state_icon, True, True, 0)
  69.         name_label = Gtk.Label(label = _('_Queue'), use_underline = True)
  70.         hb2.pack_start(name_label, True, True, 0)
  71.         left.pack_start(hb2, False, True, 0)
  72.         b = SmallImageButton(image = Gtk.Image.new_from_stock(Gtk.STOCK_CLEAR, Gtk.IconSize.MENU))
  73.         b.set_tooltip_text(_('Remove all songs from the queue'))
  74.         b.connect('clicked', self._QueueExpander__clear_queue)
  75.         b.hide()
  76.         b.set_relief(Gtk.ReliefStyle.NONE)
  77.         left.pack_start(b, False, False, 0)
  78.         count_label = Gtk.Label()
  79.         left.pack_start(count_label, False, True, 0)
  80.         outer.pack_start(left, True, True, 0)
  81.         close_button = SmallImageButton(image = SymbolicIconImage('window-close', Gtk.IconSize.MENU), relief = Gtk.ReliefStyle.NONE)
  82.         close_button.connect(('clicked',), (lambda : self.hide()))
  83.         outer.pack_start(close_button, False, False, 6)
  84.         self.set_label_fill(True)
  85.         cb = ConfigCheckButton(_('_Random'), 'memory', 'shufflequeue')
  86.         cb.connect('toggled', self._QueueExpander__queue_shuffle, self.queue.model)
  87.         cb.set_active(config.getboolean('memory', 'shufflequeue'))
  88.         left.pack_start(cb, False, True, 0)
  89.         self.set_label_widget(outer)
  90.         self.add(sw)
  91.         connect_obj(self, 'notify::expanded', self._QueueExpander__expand, cb, b)
  92.         targets = [
  93.             ('text/x-quodlibet-songs', Gtk.TargetFlags.SAME_APP, DND_QL),
  94.             ('text/uri-list', 0, DND_URI_LIST)]
  95.         targets = [ Gtk.TargetEntry.new(*t) for t in targets ]
  96.         self.drag_dest_set(Gtk.DestDefaults.ALL, targets, Gdk.DragAction.COPY)
  97.         self.connect('drag-motion', self._QueueExpander__motion)
  98.         self.connect('drag-data-received', self._QueueExpander__drag_data_received)
  99.         self.show_all()
  100.         self.queue.model.connect_after('row-inserted', util.DeferredSignal(self._QueueExpander__check_expand), count_label)
  101.         self.queue.model.connect_after('row-deleted', util.DeferredSignal(self._QueueExpander__update_count), count_label)
  102.         cb.hide()
  103.         connect_obj(self, 'notify::visible', self._QueueExpander__visible, cb, menu, b)
  104.         self._QueueExpander__update_count(self.model, None, count_label)
  105.         connect_destroy(player, 'song-started', self._QueueExpander__update_state_icon, state_icon)
  106.         connect_destroy(player, 'paused', self._QueueExpander__update_state_icon_pause, state_icon, True)
  107.         connect_destroy(player, 'unpaused', self._QueueExpander__update_state_icon_pause, state_icon, False)
  108.         
  109.         def hack(expander):
  110.             label = expander.get_label_widget()
  111.             if label:
  112.                 label.unmap()
  113.                 label.map()
  114.  
  115.         self.connect('map', hack)
  116.  
  117.     
  118.     def model(self):
  119.         return self.queue.model
  120.  
  121.     model = property(model)
  122.     
  123.     def __update_state_icon(self, player, song, state_icon):
  124.         if self.model.sourced:
  125.             state_icon.play()
  126.         else:
  127.             state_icon.stop()
  128.  
  129.     
  130.     def __update_state_icon_pause(self, player, state_icon, paused):
  131.         if self.model.sourced:
  132.             if paused:
  133.                 state_icon.pause()
  134.             else:
  135.                 state_icon.play()
  136.         else:
  137.             state_icon.stop()
  138.  
  139.     
  140.     def __clear_queue(self, activator):
  141.         self.model.clear()
  142.  
  143.     
  144.     def __motion(self, wid, context, x, y, time):
  145.         Gdk.drag_status(context, Gdk.DragAction.COPY, time)
  146.         return True
  147.  
  148.     
  149.     def __update_count(self, model, path, lab):
  150.         if len(model) == 0:
  151.             text = ''
  152.         else:
  153.             time = sum([ row[0].get('~#length', 0) for row in model ])
  154.             text = ngettext('%(count)d song (%(time)s)', '%(count)d songs (%(time)s)', len(model)) % {
  155.                 'count': len(model),
  156.                 'time': util.format_time_display(time) }
  157.         lab.set_text(text)
  158.  
  159.     
  160.     def __check_expand(self, model, path, iter, lab):
  161.         if not self.get_property('visible'):
  162.             self.set_expanded(False)
  163.         self._QueueExpander__update_count(model, path, lab)
  164.         self.show()
  165.  
  166.     
  167.     def __drag_data_received(self, expander, *args):
  168.         self.queue.emit('drag-data-received', *args)
  169.  
  170.     
  171.     def __queue_shuffle(self, button, model):
  172.         if not button.get_active():
  173.             model.order = OrderInOrder(model)
  174.         else:
  175.             model.order = OrderShuffle(model)
  176.  
  177.     
  178.     def __expand(self, cb, prop, clear):
  179.         cb.set_property('visible', self.get_expanded())
  180.         clear.set_property('visible', self.get_expanded())
  181.  
  182.     
  183.     def __visible(self, cb, prop, menu, clear):
  184.         value = self.get_property('visible')
  185.         config.set('memory', 'queue', str(value))
  186.         menu.set_active(value)
  187.         self.set_expanded(not self.model.is_empty())
  188.         cb.set_property('visible', self.get_expanded())
  189.         clear.set_property('visible', self.get_expanded())
  190.  
  191.  
  192.  
  193. class QueueModel(PlaylistModel):
  194.     '''Own class for debugging'''
  195.     pass
  196.  
  197.  
  198. class PlayQueue(SongList):
  199.     sortable = False
  200.     
  201.     class CurrentColumn(Gtk.TreeViewColumn):
  202.         header_name = '~current'
  203.         
  204.         def __init__(self):
  205.             super(PlayQueue.CurrentColumn, self).__init__()
  206.             self.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
  207.             self.set_fixed_width(24)
  208.  
  209.  
  210.     
  211.     def __init__(self, library, player):
  212.         super(PlayQueue, self).__init__(library, player, model_cls = QueueModel)
  213.         self.set_size_request(-1, 120)
  214.         self.connect('row-activated', self._PlayQueue__go_to, player)
  215.         connect_obj(self, 'popup-menu', self._PlayQueue__popup, library)
  216.         self.enable_drop()
  217.         connect_obj(self, 'destroy', self._PlayQueue__write, self.model)
  218.         self._PlayQueue__fill(library)
  219.         self.connect('key-press-event', self._PlayQueue__delete_key_pressed)
  220.  
  221.     
  222.     def __delete_key_pressed(self, widget, event):
  223.         if qltk.is_accel(event, 'Delete'):
  224.             self._PlayQueue__remove()
  225.             return True
  226.  
  227.     
  228.     def __go_to(self, view, path, column, player):
  229.         self.model.go_to(self.model.get_iter(path))
  230.         player.next()
  231.  
  232.     
  233.     def __fill(self, library):
  234.         
  235.         try:
  236.             filenames = file(QUEUE, 'rU').readlines()
  237.         except EnvironmentError:
  238.             pass
  239.  
  240.         filenames = map(str.strip, filenames)
  241.         if library.librarian:
  242.             library = library.librarian
  243.         songs = filter(None, map(library.get, filenames))
  244.         for song in songs:
  245.             self.model.append([
  246.                 song])
  247.         
  248.  
  249.     
  250.     def __write(self, model):
  251.         filenames = '\n'.join([ row[0]['~filename'] for row in model ])
  252.         f = file(QUEUE, 'w')
  253.         f.write(filenames)
  254.         f.close()
  255.  
  256.     
  257.     def __popup(self, library):
  258.         songs = self.get_selected_songs()
  259.         if not songs:
  260.             return None
  261.         menu = None(library, songs, queue = False, remove = False, delete = False, parent = self)
  262.         menu.preseparate()
  263.         remove = Gtk.ImageMenuItem(Gtk.STOCK_REMOVE, use_stock = True)
  264.         qltk.add_fake_accel(remove, 'Delete')
  265.         remove.connect('activate', self._PlayQueue__remove)
  266.         menu.prepend(remove)
  267.         menu.show_all()
  268.         return self.popup_menu(menu, 0, Gtk.get_current_event_time())
  269.  
  270.     
  271.     def __remove(self, *args):
  272.         self.remove_selection()
  273.  
  274.  
  275.